//
//  base01.m
//  base01
//
//  Created by China Dragon on 2022/4/4.
//
/*
 MAC快捷键 Xcode快捷键大全 命令行
 https://www.jianshu.com/p/1f7997114fcc
 
 14个Xcode中常用的快捷键操作
 https://www.cnblogs.com/kenshinobiy/p/4820488.html
 
 iOS基础之Object-C程序创建
 https://www.sohu.com/a/129475736_652103
 */
#import <Foundation/Foundation.h>
//int main(int argc, const char * argv[]){
//    /*
//     IOS main 函数中为何要包着 @autoreleasepool ？
//     https://www.zhihu.com/question/36223959
//     主线程runloop加个自动释放池
//   
//     链接：https://www.zhihu.com/question/36223959/answer/66538192
//
//     给RunLoop加上一个池的答案其实并不是很正确。在CFRunLoopRun核心实现__CFRunLoopRun的反汇编中可以看出，rl本身就自己压了一个池，如果说只是为rl需要外界提供一个池，那显然不对，rl本身首先无法知道外界是否已经提供希望rl使用的池，而且在使用池的过程中只能使用池链的顶端的那一个，如果rl进入没有池其实也没关系，在objc_autorelease的实现里会有快速和慢速两个，快速就是根据“标兵”决定是否需要入池，慢速就是没有池可以用，需要创建一个新池，跟外部给不给无所谓。但是，重要的是在main那个池块的pop点，如果main不像这么“简单”的话，多出来的autoreleased objects将在运行的时候没有合适的释放点直到运行结束，这才是这个main的池块的关键所在。这个池块给出了一个pop点来显式的告诉我们这里有一个释放点，如果你的main在初始化的过程中有别的内容可以放在这里，当然最好是别的地方，比如 @autoreleasepool { xxx; do somethings } @autoreleasepool { return UIApplicationMain(...); } 还有一点不知道有没有注意，可以让可以被释放的对象在return时释放掉，排除干扰，用于检查资源泄漏相关的问题
//     */
//    
//    
//    @autoreleasepool {
//        NSLog(@"base01 hello world");
//    }
//    return 0;
//}
